Java的类对象锁 synchronized(xxx.class)

Java的类对象锁 synchronized(xxx.class) 从字面上讲,只锁住了类对象,就是在方法区中表示这个类的元数据信息的类对象。通过实验验证,也确实如此。用的是sun 的jdk 1.6.24。

 

测试类:Test.java   TestClassMethod.java  TestObjMethod.java

在测试类中有2个方法,一个类方法,一个实例方法。

TestClassMethod.java  TestObjMethod.java 两个类实现了Runnable接口,分别在run方法中调用类方法和实例方法。 TestClassMethod.java在调用类方法时使用了synchronized把Test.class锁住。

但是在TestObjMethod中仍然能对实例方法进行访问。

 

刚开始,将测试类的实例化对象作为类的静态属性,怕锁住类对象后,其他线程不能完成Test的实例化工作,但这个担心是多余了,在TestObjMethod的run方法中循环构造 Test的对象,都是没有问题的。

再测试对Test中类属性(静态属性)的访问,同样也是没问题的。在Test的 实例方法中访问Test的类属性,在一个线程把Test类对象锁住后,另一个调用实例方法的线程同样能访问到类属性。

 

再测试在实例方法中调用类方法,结果当另一个线程将类对象锁住后,类方法就不能被其他线程访问了。

 

所以,synchronized(xxx.class)只能锁住类的方法,类的属性、元数据等都是没有被锁住的,可以被其他线程访问。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值